<?php
/**
 * utilValidator
 *
 * 사용에 앞서...
 * getInstance 메소드로 객체 생성후
 * initialize 메소드를 반드시 한번은 실행해 주어야 한다.
 * 이곳에서 파라미터(get, post)와 언어팩을 설정하기 때문.
 *
 * <code>
 * $aResult = $utilValidator->inspection(array(
 *     array(
 *         'id' => 'user_id',
 *         'label' => '아이디',
 *         'filter' => 'isFill&isIdentity'
 *     ),
 *     array(
 *         'id' => 'user_pass',
 *         'label' => '패스워드',
 *         'filter' => 'isFill&isMin[4]&isMax[20]',
 *     ),
 *     array(
 *         'id' => 'user_pass_confirm',
 *         'label' => '패스워드확인',
 *         'filter' => 'isFill&isMin[4]&isMax[20]&isMatch[user_pass]',
 *     )
 * );
 * </code>
 *
 * !!NOTICE!!
 * utilValidator를 확장해서 사용할 경우 아래와 같은 코드는 필수적입니다.
 * <code>
 * class libValidator extends utilValidator
 * {
 *     public static function getInstance()
 *     {
 *         return parent::getInstance(__CLASS__);
 *     }
 *
 *     ...
 * }
 * </code>
 *
 * 해당 클래스는 싱글톤으로 생성되기 때문에 확장하는 클래스를 명시해줄 필요성이 있습니다.
 *
 * @package util
 */
class utilValidator
{
    const CODE_SUCCESS = true;
    const CODE_FAIL = false;


    /**
     * instance
     */
    private static $instance = null;

    /**
     * Post, Get 파라미터
     * @var array
     */
    public $aParam;

    /**
     * 필터타입별 에러메세지
     * @var array
     */
    public $aErrorMsg;

    /**
     * 필수항목 에러메세지(항목아이디별)
     * @var array
     */
    public $aRequireMsg;

    /**
     * 현재 검사중인 필드 아이디
     * @var string
     */
    public $sCurrField;

    /**
     * 현재 검사중인 필드 라벨
     * @var string
     */
    public $sCurrLabel;

    /**
     * 현재 검사중인 필드의 에러메세지
     * @var string
     */
    public $sCurrErrorMsg;

    private function __construct(){}

    /**
     * utilValidator Instance
     *
     * @param string $sClassName (클래스명 : 기본 utilValidator)
     * @return utilValidator
     */
    public static function getInstance($sClassName=null)
    {
        $sClassName = is_null($sClassName) ? __CLASS__ : $sClassName;

        if (!self::$instance) self::$instance = new $sClassName;

        return self::$instance;
    }

    /**
     * 인스턴스 반환
     *
     * @return utilValidator
     */
    public static function instance()
    {
        return self::$instance;
    }

    /**
     * 인스턴스 파괴
     */
    public static function instancedel()
    {
        self::$instance = null;
    }

    /**
     * 초기화
     *
     * @param array $aParam
     * @param string $sLang (기본은 한국어 : ko)
     */
    public function initialize($aParam=array(), $sLang='ko')
    {
        if (!is_array($aParam)) {
            throw new Exception('Validator initialize failed - is not array', E_ERROR);
        }

        $sPath = dirname(__FILE__). '/Validator/' .$sLang . '.php';
        include($sPath);

        $this->aRequireMsg = array();
        $this->aErrorMsg = $lang;
        $this->aParam = $aParam;
    }

    /**
     * 항목별 필수 입력 에러 메시지 할당
     *
     * @param string $sName
     * @param string $sMsg
     */
    public function setRequireErrorMsg($sName, $sMsg)
    {
        $this->aRequireMsg[$sName] = $sMsg;
    }

    /**
     * 필터타입별  에러 메시지 할당
     *
     * @param string $sFilter
     * @param string $sMsg
     */
    public function setFilterErrorMsg($sFilter, $sMsg)
    {
        $this->aErrorMsg[$sFilter] = $sMsg;
    }

    /**
     * 언어팩에 할당된 메세지를 오버라이딩
     *
     * @param array | string $sPath (언어팩 파일의 절대경로 혹은 언어팩 배열)
     * @return boolean
     */
    public function overrideLanguagePack($sPath)
    {
        if (is_array($sPath)) {
            $this->aErrorMsg = $sPath;
            return true;
        }

        if (!file_exists($sPath)) return false;
        include($sPath);

        if (empty($lang)) return false;

        $this->aErrorMsg = $lang;

        return true;
    }

    /**
     * Validator 실행기
     *
     * @param array|string $key
     * @param string $sValue
     * @param string $sLabel
     * @param string $sFilter
     * @param string $sMsg
     *
     * @return array(
     *    'passed' => boolean,
     *    'msg' => 메세지
     * );
     */
    public function inspection($key, $sValue='', $sLabel='', $sFilter='', $sMsg='')
    {
        if (is_array($key)) {
            if ( empty($key) ) {
                return array('passed'=>true, 'msg'=> 'success');
            }

            foreach ($key as $aData) {
                $sId = $aData['id'];
                $sValue = $aData['value'];
                $sLabel = $aData['label'];
                $sFilter = $aData['filter'];
                $sMsg = $aData['msg'];

                $result = $this->_inspection($sId, $sValue, $sLabel, $sFilter, $sMsg);

                if ($result['passed'] === self::CODE_FAIL) break;
            }
        } else {
            $result = $this->_inspection($key, $sValue, $sLabel, $sFilter, $sMsg);
        }

        return $result;
    }

    /**
     * Validator 실행기 구현체
     */
    private function _inspection($sId, $sValue, $sLabel, $sFilter, $sMsg)
    {
        $sId = trim($sId);
        $value = $sValue !== null ? $sValue : $this->aParam[$sId];

        $this->sCurrField = $sId;
        $this->sCurrLabel = $sLabel;

        if (is_array($value)) {
            $value = implode('', $value);
        }
        $value = $value;

        $result = $this->getResult(self::CODE_SUCCESS);

        // is로 시작하지 않는것들은 정규표현식으로 간주함.
        if ( preg_match('/^is/i', $sFilter) ) {
            $aFilter = explode('&', $sFilter);

            // 필수항목이 아닌경우 빈값이 들어왔을경우는 유효성 체크를 하지 않음.
            if ( (preg_match('/isFill/i', $sFilter) === 0) && empty($value) ) {
                return $result;
            }

            foreach ($aFilter as $filter) {
                $aFilterInfo = $this->getFilterInfo($filter);
                $filter = $aFilterInfo['id'];
                $param = $aFilterInfo['param'];

                // 필수 입력 필터의 경우 항목관리에서 사용자가 메세지를 직접 지정하는 부분이 있어 이렇게 처리
                if ($filter == 'isFill') {
                    $this->sCurrErrorMsg = isset($this->aRequireMsg[$sId]) ? $this->aRequireMsg[$sId] : $this->aErrorMsg['isFill'];
                } else {
                    $this->sCurrErrorMsg = $sMsg ? $sMsg : $this->aErrorMsg[$filter];
                }

                // 존재하지 않는 필터인 경우 에러코드 반환
                if (method_exists($this, $filter) === false) {
                    $this->sCurrErrorMsg = $this->aErrorMsg['notMethod'];
                    return $this->getResult(self::CODE_FAIL);
                }

                $result = call_user_func(array($this, $filter), $value, $param);

                if ($result['passed'] == self::CODE_FAIL) break;
            }
        } else {
            $this->sCurrErrorMsg = $sMsg ? $sMsg : $this->aErrorMsg['isRegex'];
            $result = $this->isRegex($value, $sFilter);
        }

        return $result;
    }

    /**
     * 필터이름에서 정보를 분리하는 역할
     */
    private function getFilterInfo($sFilter)
    {
        preg_match('/(is[a-z]*)((?:\[.*?\])*)/i', $sFilter, $matches);
        $aResult['id'] = $matches[1];
        $aResult['param'] = $this->getFilterParam($matches[2]);

        return $aResult;
    }

    /**
     * 필터의 파라미터 파싱
     */
    private function getFilterParam($sParam)
    {
        if (empty($sParam)) return '';

        if (preg_match_all('/\[(.+?)\]/', $sParam, $aMatch) === 0) {
            return '';
        }

        $iCount = count($aMatch[0]);

        if ($iCount == 1) {
            return $aMatch[1][0];
        }

        $aResult = array();
        for ($i = 0; $i < $iCount; $i++) {
            $aResult[] = $aMatch[1][$i];
        }

        return $aResult;
    }

    /**
     * 각 필터 결과코드 생성
     */
    protected function getResult($code)
    {
        if ($code == self::CODE_SUCCESS) {
            $result = array(
                'passed' => self::CODE_SUCCESS,
                'msg' => 'success'
            );
        } else {
            $sMsg = str_replace('{label}', $this->sCurrLabel, $this->sCurrErrorMsg);

            $result = array(
                'passed' => self::CODE_FAIL,
                'msg' => $sMsg
            );
        }

        return $result;
    }

    /**
     * 숫자 형태로 문자를 치환시켜주기
     * 123,123,123
     * 123123,123
     * 123%
     * 123  %
     * 123.4
     * -123
     * ,123
     *
     * @param string $sStr
     * @return string
     */
    protected function numberconv($sStr)
    {
        $sStr = str_replace(',', '', $sStr);
        $sStr = str_replace('%', '', $sStr);
        $sStr = str_replace(' ', '', $sStr);

        return $sStr;
    }

    /**
     * 글자수 반환
     */
    protected function strlen($str)
    {
        $limit = 0;
        $count = 0;
        $byte_len = strlen($str);
        $isCompleteChar = FW_BYTE_PER_CHAR;

        for ($i = 0; $i < $byte_len; ++$i) {
            if ( ord($str[$i]) >= 0x80 ) {

                ++$count;

                if ( $count == $isCompleteChar ) {
                    ++$limit;
                    $count = 0;
                }

            } else {

                ++$limit;

            }
        }

        return $limit;
    }


    /**
     * 필수값 체크
     */
    protected function isFill($sValue)
    {
        $sValue = trim($sValue);

        if (!isset($sValue{0})) {
            $aResponse = $this->getResult(self::CODE_FAIL);
        } else {
            $aResponse = $this->getResult(self::CODE_SUCCESS);
        }

        return $aResponse;
    }

    /**
     * 아이디형식 체크
     */
    protected function isIdentity($sValue)
    {
        if ( preg_match('/^[a-z]+[a-z0-9_]+$/i', $sValue) === 0 ) {
            $aResponse = $this->getResult(self::CODE_FAIL);
        } else {
            $aResponse = $this->getResult(self::CODE_SUCCESS);
        }

        return $aResponse;
    }

    /**
     * 숫자형식 체크
     */
    protected function isNumber($sValue, $iCond)
    {
        if (empty($iCond) === true) {
            $iCond = 1;
        }

        $iCond = (int)$iCond;

        $iPos = 1;    //양수
        $iNga = 2;    //음수
        $iMinPos = 4; //소수(양수)
        $iMinNga = 8; //소수(음수)

        $iResult = 0;

        if ( preg_match('/^[0-9]+$/', $sValue) !== 0 ) {
            $iResult = $iPos;
        } else if ( preg_match('/^[-][0-9]+$/', $sValue) !== 0 ) {
            $iResult = $iNga;
        } else if ( preg_match('/^[0-9]+[.][0-9]+$/', $sValue) !== 0 ) {
            $iResult = $iMinPos;
        } else if ( preg_match('/^[-][0-9]+[.][0-9]+$/', $sValue) !== 0 ) {
            $iResult = $iMinNga;
        }

        if ($iResult & $iCond) {
            return $this->getResult(self::CODE_SUCCESS);
        }

        return $this->getResult(self::CODE_FAIL);
    }

    /**
     * 영문형식 체크
     */
    protected function isAlpha($sValue)
    {
        if ( preg_match('/^[a-z]+$/i', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 영문형식 체크 - 대문자
     */
    protected function isAlphaUpper($sValue)
    {
        if ( preg_match('/^[A-Z]+$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 영문형식 체크 - 소문자
     */
    protected function isAlphaLower($sValue)
    {
        if ( preg_match('/^[a-z]+$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 영문,숫자형식 체크
     */
    protected function isAlphaNum($sValue)
    {
        if ( preg_match('/^[a-z0-9]+$/i', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 영문,숫자형식 체크 - 대문자
     */
    protected function isAlphaNumUpper($sValue)
    {
        if ( preg_match('/^[A-Z0-9]+$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 영문,숫자형식 체크 - 소문자
     */
    protected function isAlphaNumLower($sValue)
    {
        if ( preg_match('/^[a-z0-9]+$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 영문,숫자,_,- 형식 체크
     */
    protected function isAlphaDash($sValue)
    {
        if ( preg_match('/^[a-z0-9_\-]+$/i', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 영문,숫자,_,- 형식 체크 - 대문자
     */
    protected function isAlphaDashUpper($sValue)
    {
        if ( preg_match('/^[A-Z0-9_\-]+$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 영문,숫자,_,- 형식 체크 - 소문자
     */
    protected function isAlphaDashLower($sValue)
    {
        if ( preg_match('/^[a-z0-9_\-]+$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 이메일형식 체크
     */
    protected function isEmail($sValue)
    {
        if ( preg_match('/^([a-z0-9\_\-\.]+)@([a-z0-9\_\-]+\.)+[a-z]{2,6}$/i', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * URL 형식 체크
     */
    protected function isUrl($sValue)
    {
        if ( preg_match('/http[s]?:\/\/[a-z0-9_\-]+(\.[a-z0-9_\-]+)+/i', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 주민번호 형식 체크
     */
    protected function isSsn($sValue)
    {
        $sValue = preg_replace('/[^0-9]/', '', $sValue);
        if ( preg_match('/[0-9]{2}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}[1234]{1}[0-9]{6}$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        $sum = 0;
        $last = $sValue[12];
        $bases = '234567892345';
        for ($i=0; $i<12; ++$i) {
            $sum += $sValue[$i] * $bases[$i];
        }

        $mod = $sum % 11;
        if ( (11 - $mod) % 10 != $last ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 외국인번호 형식 체크
     */
    protected function isForeignerNo($sValue)
    {
        $sValue = preg_replace('/[^0-9]/', '', $sValue);
        if ( preg_match('/[0-9]{2}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}[5678]{1}[0-9]{1}[02468]{1}[0-9]{2}[6789]{1}[0-9]{1}$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        $sum = 0;
        $last = $sValue[12];
        $bases = '234567892345';
        for ($i=0; $i<12; ++$i) {
            $sum += $sValue[$i] * $bases[$i];
        }

        $mod = $sum % 11;
        if ( (11 - $mod + 2) % 10 != $last ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 사업자번호 형식 체크
     */
    protected function isBizNo($sValue)
    {
        $sValue = preg_replace('/[^0-9]/', '', $sValue);
        if ( preg_match('/[0-9]{3}[0-9]{2}[0-9]{5}$/',$sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        $sum = $sValue[0];

        $chkno = array(0, 3, 7, 1, 3, 7, 1, 3);
        for($i = 1; $i < 8; ++$i) $sum += ($sValue[$i] * $chkno[$i]) % 10;
        $sum += floor($sValue[8] * 5 / 10);
        $sum += ($sValue[8] * 5) % 10 + $sValue[9];

        if ( ($sum % 10) != 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 법인번호 형식 체크
     */
    protected function isJuriNo($sValue)
    {
        $sValue = preg_replace('/[^0-9]/', '', $sValue);

        if ( preg_match('/^([0-9]{6})([0-9]{7})$/',$sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        $sum = 0;
        $last = $sValue[12];
        for ($i=0; $i<12; ++$i) {
            if ($i % 2 == 0) {
                $sum += $sValue[$i];
            } else {
                $sum += $sValue[$i] * 2;
            }
        }

        $mod = $sum % 10;

        if ( (10 - $mod) % 10 != $last ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 한글 형식 체크
     */
    protected function isKorean($sValue)
    {
        for ($i = 0; $i < strlen($sValue); ++$i) {
            $chk = ord($sValue[$i]);

            #공백
            if ($chk == 0x20) continue;

            if ($chk < 0x80) {
                return $this->getResult(self::CODE_FAIL);
            }
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 전화번호 형식 체크
     */
    protected function isPhone($sValue)
    {
        $sValue = preg_replace('/[^0-9]/', '', $sValue);
        if ( preg_match('/^(02|0[0-9]{2,3})[1-9]{1}[0-9]{2,3}[0-9]{4}$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 핸드폰 형식 체크
     */
    protected function isMobile($sValue)
    {
        $sValue = preg_replace('/[^0-9]/', '', $sValue);
        if ( preg_match('/^01[016789][1-9]{1}[0-9]{2,3}[0-9]{4}$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 우편번호 형식 체크
     */
    protected function isZipcode($sValue)
    {
        $sValue = preg_replace('/[^0-9]/', '', $sValue);
        if ( preg_match('/^[0-9]{3}[0-9]{3}$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 아이피 형식 체크
     */
    protected function isIp($sValue)
    {
        if ( preg_match('/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]|\*)(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]|\*)){2,}$/i', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 타필드와 값이 동일한지 체크
     */
    protected function isMatch($sValue, $sTargetId)
    {
        $sTargetValue = $this->aParam[$sTargetId];

        if ($sValue != $sTargetValue) {
            $this->sCurrErrorMsg = str_replace('{match}', $sTargetId, $this->sCurrErrorMsg);
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 최대글자 체크
     */
    protected function isMax($sValue, $iLen)
    {
        $iCount = $this->strlen($sValue);

        if ($iCount > $iLen) {
            $this->sCurrErrorMsg = str_replace('{max}', $iLen, $this->sCurrErrorMsg);
            $aResponse = $this->getResult(self::CODE_FAIL);
        } else {
            $aResponse = $this->getResult(self::CODE_SUCCESS);
        }

        return $aResponse;
    }

    /**
     * 최소글자 체크
     */
    protected function isMin($sValue, $iLen)
    {
        $iCount = $this->strlen($sValue);

        if ($iCount < $iLen) {
            $this->sCurrErrorMsg = str_replace('{min}', $iLen, $this->sCurrErrorMsg);
            $aResponse = $this->getResult(self::CODE_FAIL);
        } else {
            $aResponse = $this->getResult(self::CODE_SUCCESS);
        }

        return $aResponse;
    }

    /**
     * Flag 필드 체크 (Y or N)
     */
    protected function isFlag($sValue)
    {
        if ( preg_match('/^[YN]$/', $sValue) === 0 ) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 금지단어 체크
     * 각 단어는 ,로 구분한 문자열이 넘어와야 한다.
     * 파라미터는 금지단어가 와야한다.
     */
    protected function isGoodword($sValue, $sBlockWord)
    {
        if (empty($sBlockWord)) {
            return $this->getResult(self::CODE_SUCCESS);
        }

        $sBlockWord = preg_quote($sBlockWord, '/');
        $regex = '/('.str_replace(',', '|', $sBlockWord).')/i';

        if ( preg_match($regex, $sValue) === 0 ) {
            return $this->getResult(self::CODE_SUCCESS);
        }

        return $this->getResult(self::CODE_FAIL);
    }

    /**
     * 정규식 체크
     */
    protected function isRegex($sValue, $sRegex)
    {
        if ( preg_match($sRegex, $sValue) === 0 ) {
            $aResponse = $this->getResult(self::CODE_FAIL);
        } else {
            $aResponse = $this->getResult(self::CODE_SUCCESS);
        }

        return $aResponse;
    }

    /**
     * 여권번호 체크
     */
    protected function isPassport($sValue)
    {
        if ( preg_match('/^[A-Z]{2}[0-9]{7}$/i', $sValue) === 1 ) {
            // 일반 여권
            return $this->getResult(self::CODE_SUCCESS);
        }

        if ( preg_match('/^[A-Z]{1}[0-9]{8}$/i', $sValue) === 1 ) {
            // 전자 여권
            return $this->getResult(self::CODE_SUCCESS);
        }

        return $this->getResult(self::CODE_FAIL);
    }

    /**
     * 길이 범위 체크
     */
    protected function isLengthRange($sValue, $aRange)
    {
        $iMin = $aRange[0] <= 0 ? 0 : (int)$aRange[0];
        $iMax = $aRange[1] <= 0 ? 0 : (int)$aRange[1];

        $iLen = $this->strlen($sValue);

        if ($iLen < $iMin || $iLen > $iMax) {
            $this->sCurrErrorMsg = str_replace('{min}', $iMin, $this->sCurrErrorMsg);
            $this->sCurrErrorMsg = str_replace('{max}', $iMax, $this->sCurrErrorMsg);
            $aResponse = $this->getResult(self::CODE_FAIL);
        } else {
            $aResponse = $this->getResult(self::CODE_SUCCESS);
        }

        return $aResponse;
    }

    /**
     * 숫자 최소값 체크
     */
    protected function isNumberMin($sValue, $iLimit)
    {
        $sValue = $this->numberconv($sValue);
        $iLimit = $this->numberconv($iLimit);

        if ($sValue < $iLimit) {
            $this->sCurrErrorMsg = str_replace('{min}', $iLimit, $this->sCurrErrorMsg);
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 숫자 최대값 체크
     */
    protected function isNumberMax($sValue, $iLimit)
    {
        $sValue = $this->numberconv($sValue);
        $iLimit = $this->numberconv($iLimit);

        if ($sValue > $iLimit) {
            $this->sCurrErrorMsg = str_replace('{max}', $iLimit, $this->sCurrErrorMsg);
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }

    /**
     * 숫자 범위값 체크
     */
    protected function isNumberRange($sValue, $aRange)
    {
        $sValue = $this->numberconv($sValue);
        $iMin = $this->numberconv($aRange[0]);
        $iMax = $this->numberconv($aRange[1]);

        if ($sValue < $iMin || $sValue > $iMax) {
            $this->sCurrErrorMsg = str_replace('{min}', $iMin, $this->sCurrErrorMsg);
            $this->sCurrErrorMsg = str_replace('{max}', $iMax, $this->sCurrErrorMsg);
            $aResponse = $this->getResult(self::CODE_FAIL);
        } else {
            $aResponse = $this->getResult(self::CODE_SUCCESS);
        }

        return $aResponse;
    }

    /**
     * 날짜 체크
     *
     * 아래 형태는 모두 유효한 값
     * 2000109
     * 1985-1-19
     * 1990-03-5
     * 1985-10-19
     * 1985.10.19
     * 1985,10.19
     * 1985;;10--19
     */
    protected function isDate($sValue)
    {
        $sValue = preg_replace('/[^0-9]/', '', $sValue);

        if (preg_match('/^[12][0-9]{3}(([0]?[1-9])|([1][012]))[0-3]?[0-9]$/', $sValue) === 0) {
            return $this->getResult(self::CODE_FAIL);
        }

        return $this->getResult(self::CODE_SUCCESS);
    }
}